package com.bjsxt.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsxt.domain.WorkIssue;
import com.bjsxt.dto.UserDto;
import com.bjsxt.feign.UserFeignClient;
import com.bjsxt.mapper.WorkIssueMapper;
import com.bjsxt.model.WorkIssueVo;
import com.bjsxt.service.WorkIssueService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class WorkIssueServiceImpl extends ServiceImpl<WorkIssueMapper, WorkIssue> implements WorkIssueService {

    /**
     * 注入会员用户操作的 openFeign 对象
     */
    @Autowired
    private UserFeignClient userFeignClient;

    /**
     * 分页查询工单列表
     *
     * @param page      分页对象<WorkIssue>
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param status    状态
     * @return 工单列表分页数据
     */
    @Override
    public Page<WorkIssueVo> pageByCreateTimeAndStatus(Page<WorkIssue> page, Date startTime, Date endTime, Integer status) {
        // 根据开始时间,结束时间,状态模糊查询分页数据
        Page<WorkIssue> workIssuePage = page(page, new LambdaQueryWrapper<WorkIssue>()
                .ge(startTime != null, WorkIssue::getCreated, startTime)
                .le(endTime != null, WorkIssue::getCreated, endTime)
                .eq(status != null, WorkIssue::getStatus, status)
        );
        // 首先获取用户的 id 集合
        List<Long> ids = workIssuePage.getRecords().stream().map(WorkIssue::getUserId).distinct().collect(Collectors.toList());
        // 根据用户的 ids 查询用户集合
        List<UserDto> basicUsers = userFeignClient.getBasicUsers(ids);
        // 在这里在进行获取值的时候比较的麻烦所以这里需要将 List<UserDto> 转换为 map 对象
        Map<Long, UserDto> userDtoMap;
        // 判断返回的对象是否是空集合
        if (basicUsers == null || basicUsers.isEmpty())
            userDtoMap = new HashMap<Long, UserDto>();
        else
            userDtoMap = basicUsers.stream().collect(Collectors.toMap(UserDto::getId, userDto -> userDto));
        // 将 page<entity> 对象转换为对应的 page<vo> 对象
        IPage<WorkIssueVo> workIssueVoPage = workIssuePage.convert(item -> {
            // 创建需要转换的 vo 数据对象.
            WorkIssueVo workIssueVo = new WorkIssueVo();
            // 进行值的 copy
            BeanUtil.copyProperties(item, workIssueVo);
            // 这里使用 map 获取对应的 User 数据进行拼接
            UserDto userDto = userDtoMap.get(item.getUserId());
            // 如果获取的 userDto 不是空，则进行数据的填充操作
            if (userDto != null) {
                // 获取 dto 中的数据值，如果是空，那么就使用原数据，否则用查出的数据
                workIssueVo.setUsername(StringUtils.isNotBlank(userDto.getUsername()) ? userDto.getUsername() : workIssueVo.getUsername());
                // 获取 dto 中的数据值，如果是空，那么就使用原数据，否则用查出的数据
                workIssueVo.setRealName(StringUtils.isNotBlank(userDto.getRealName()) ? userDto.getRealName() : workIssueVo.getRealName());
            }
            // 返回对象
            return workIssueVo;
        });
        // 返回分页 vo 对象
        return (Page<WorkIssueVo>) workIssueVoPage;
    }

    /**
     * 根据用户 ID 分页查询工单数据
     *
     * @param page   分页对象<WorkIssue>
     * @param userId 用户id(提问用户id)
     * @return 工单列表分页数据
     */
    @Override
    public Page<WorkIssue> pageByUserId(Page<WorkIssue> page, Long userId) {
        // 调用分页方法进行数据的查询
        return page(page, new LambdaQueryWrapper<WorkIssue>().eq(WorkIssue::getUserId, userId));
    }
}
